package gui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener {

    int data[][] = new int[3][3];
    int i = 0;
    int j = 0;

    int x = 0;
    int y = 0;

    int win[][] = {
            {2,3,4},
            {5,6,7},
            {8,9,10}
    };
    public GameJFrame() {
        //初始化界面
        InitJFrame();

        InitJMenuBar();

        //初始化数据
        InitData();

        //初始化图片
        InitImages();

        //展示界面：
        this.setVisible(true);
    }

    private void InitData() {
        int tempArr[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Random r = new Random();

        //打乱数组中的数据
        for (i = 0; i < tempArr.length; i++) {
            int index = r.nextInt(tempArr.length);
            int temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;

        }

        //给二维数组添加数据
        for (i = 0; i < tempArr.length; i++) {
            if(tempArr[i]  == 10) {
                x = i / 3;
                y = i % 3;

            }
            else {
                data[i / 3][i % 3] = tempArr[i];
            }
            //x,y记录空白方块的位置
        }


        System.out.println(x);
        System.out.println(y);
        //获取打乱后的顺序
        for(i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i]+ " ");
        }
    }

    //初始化图片
    private void InitImages() {
        //清空已经出现的图片
        this.getContentPane().removeAll();

        if(win())
        {
            System.out.println("恭喜你！挑战成功！");
        }
        for (int i = 0; i < 3; i++) {


            for (int j = 0; j < 3; j++) {
                //获取当前要加载的图片
                int numb = data[i][j];

                //创建一个JLable的对象（管理容器）
                JLabel jlabel = new JLabel(new ImageIcon("D:\\code\\java-beginner-repository\\java_test\\javaGame1\\girl\\" + numb + ".jpg"));

                //指定图片位置
                jlabel.setBounds(j * 200, i * 200, 200, 200);
                //给图片加边框
                jlabel.setBorder(new BevelBorder(BevelBorder.RAISED));

                //把管理容器添加到界面里面
                //this.add(jlabel1);
                //获取隐藏的容器
                this.getContentPane().add(jlabel);
            }
        }
        //刷新图片
        this.getContentPane().repaint();
    }


    private void InitJMenuBar() {
        //初始化菜单
        JMenuBar jmenubar = new JMenuBar();

        //创建菜单上面的两个选项
        JMenu functionMenu = new JMenu("功能");
        JMenu aboutMenu = new JMenu("关于我们");

        //创建选项下的条目对象
        JMenuItem replayItem = new JMenuItem("重新开始");
        JMenuItem reLoginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");
        JMenuItem accountItem = new JMenuItem("关于我们");
        //将条目添加到选项中
        functionMenu.add(replayItem);
        functionMenu.add(reLoginItem);
        functionMenu.add(closeItem);

        aboutMenu.add(accountItem);
        //将选项添加到菜单中
        jmenubar.add(functionMenu);
        jmenubar.add(aboutMenu);

        //给界面设置菜单
        this.setJMenuBar(jmenubar);
    }

    private void InitJFrame() {
        this.setSize(633, 680);
        //设置标题
        this.setTitle("拼图游戏单机版 v1.0");

        //设置页面置顶
        this.setAlwaysOnTop(true);
        //设置页面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式
        this.setDefaultCloseOperation(3);
        //取消默认的居中放置
        this.setLayout(null);
        //给界面添加键盘监听事件
        this.addKeyListener(this);

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
        //按下不松时会调用此方法
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if(code ==65){
            //把界面所有图片删除
            this.getContentPane().removeAll();
            //加载一张完整的图片
            JLabel all = new JLabel(new ImageIcon("D:\\code\\java-beginner-repository\\java_test\\javaGame1\\girl\\1.jpg"));
            all.setBounds(0,0,600,600);
            this.getContentPane().add(all);
            //刷新界面
            this.getContentPane().repaint();

        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(win())
        {
            return;
        }
        int code = e.getKeyCode();
        System.out.println(code);
        if(code==37)
        {
            if(y==2)
                return;
            System.out.println("向左移动");
            //把空白方块右方数字左移
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            InitImages();
        }
        else if(code==38)
        {
            if(x==2)
                return;
            System.out.println("向上移动");
            //把空白方块下方的数字上移
            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;
            InitImages();
        }
        else if(code==39)
        {
            if(y==0)
                return;
            System.out.println("向右移动");

            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            InitImages();
        }
        else if(code==40)
        {
            if(x==0)
                return;
            System.out.println("向下移动");
            //把空白方块上方的数字下移
            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            InitImages();
        }
        else if(code==65)
        {
            InitImages();
        }
        else if(code==87)
        {
            data = new int[][]
                    {
                            {2,3,4},
                            {5,6,7},
                            {8,9,10}
                    };
            InitImages();
        }
    }

    public boolean win()
    {
        for(i =0; i < data.length;i++)
        {
            for(j = 0;j<data[i].length;j++)
            {
                if(data[i][j] != win[i][j])
                {
                    //只要有一个不一样返回false
                    return false;
                }
            }
        }
        return true;
    }
}